package br.com.caim.email.envio.impl;

import java.util.Properties;

import javax.mail.Message;
import javax.mail.MessagingException;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.AddressException;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;

import br.com.caim.bo.Mensagem;
import br.com.caim.bo.entidade.Conta;
import br.com.caim.email.auth.MailAuthenticator;
import br.com.caim.email.envio.IEnvioEmail;
import br.com.caim.email.excecoes.negocio.EnvioEmailException;

public class EnvioEmail implements IEnvioEmail {
	public boolean enviarMensagem(Conta from, Mensagem mensagem) throws AddressException, MessagingException, EnvioEmailException {
		Properties props = new Properties();
		
		System.out.println("========== DADOS ========");
		System.out.println("END_EMAIL: " + from.getEnderecoEmail());
		System.out.println("NOME_HOST: " + from.getProvedor().getNome());
		System.out.println("=========================");
		
		// quem estiver utilizando um SERVIDOR PROXY descomente essa parte e
		// atribua as propriedades do SERVIDOR PROXY utilizado
		/*
		 * props.setProperty("proxySet","true");
		 * props.setProperty("socksProxyHost","192.168.155.1"); // IP do
		 * Servidor Proxy props.setProperty("socksProxyPort","1080"); // Porta
		 * do servidor Proxy
		 */
		
		props.put("mail.transport.protocol", "smtp"); // define protocolo de
														// envio como SMTP
		props.put("mail.smtp.starttls.enable", "true");
		props.put("mail.smtp.host", from.getProvedor().getHostSmtp());
		props.put("mail.smtp.auth", "true"); // ativa autenticacao
		props.put("mail.smtp.user", from.getEnderecoEmail()); // usuario ou seja, a conta que esta
											// enviando o email (tem que ser do
											// GMAIL)
		props.put("mail.debug", "true");
	
		if(from.getProvedor().getNome().equals(GMAIL_PROVEDOR)) {
			props.put("mail.smtp.port", GMAIL_MAIL_SMTP_SERVER_PORT);
			props.put("mail.smtp.socketFactory.port", GMAIL_MAIL_SMTP_SERVER_PORT);
			props.put("mail.smtp.socketFactory.class", "javax.net.ssl.SSLSocketFactory");
			props.put("mail.smtp.socketFactory.fallback", "false");
		} else if(from.getProvedor().getNome().equals(HOTMAIL_PROVEDOR)) {
			props.put("mail.smtp.port", HOTMAIL_MAIL_SMTP_SERVER_PORT);
			props.put("mail.smtp.socketFactory.port", HOTMAIL_MAIL_SMTP_SERVER_PORT);
		} else if(from.getProvedor().getNome().equals(YAHOO_PROVEDOR)) {
			props.put("mail.smtp.port", YAHOO_MAIL_SMTP_SERVER_PORT);
			props.put("mail.smtp.socketFactory.port", YAHOO_MAIL_SMTP_SERVER_PORT);
		}
		
		// Cria um autenticador que sera usado a seguir
		MailAuthenticator auth = null;
		auth = new MailAuthenticator(from.getEnderecoEmail(), from.getSenha());

		// Session - objeto que ira realizar a conexão com o servidor
		/*
		 * Como há necessidade de autenticação é criada uma autenticacao que é
		 * responsavel por solicitar e retornar o usuário e senha para
		 * autenticação
		 */
		Session session = Session.getInstance(props, auth);
		session.setDebug(true); // Habilita o LOG das ações executadas durante o
								// envio do email

		// Objeto que contém a mensagem
		Message msg = new MimeMessage(session);

		try {
			// Setando o destinatário
			msg.setRecipient(Message.RecipientType.TO, new InternetAddress(mensagem.getPara()));
			// Setando a origem do email
			msg.setFrom(new InternetAddress(from.getEnderecoEmail()));
			// Setando o assunto
			msg.setSubject(mensagem.getAssunto());
			// Setando o conteúdo/corpo do email
			msg.setContent(mensagem.getConteudo(), "text/plain");

		} catch (Exception e) {
			System.out.println(">> Erro: Completar Mensagem");
			e.printStackTrace();
		}
		
		try {
			Transport.send(msg);
		} catch (MessagingException e1) {
			e1.printStackTrace();
			throw new EnvioEmailException();
		}
		
		return true;
	}
}